package com.jd.sys.service.impl;

import com.jd.basic.service.impl.BaseServiceImpl;
import com.jd.sys.domain.Menu;
import com.jd.sys.mapper.MenuMapper;
import com.jd.sys.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 业务实现类：
 */
@Service
@CacheConfig(cacheNames = "menu") // 统一配置
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {
    @Autowired
    private MenuMapper menuMapper;

    @Override
    @Transactional
    @CacheEvict(key = "'tree'") // 删除缓存
    public void add(Menu menu) {
        super.add(menu);
    }

    @Override
    @Transactional
    @CacheEvict(key = "'tree'") // 删除缓存
    public void update(Menu menu) {
        super.update(menu);
    }

    @Override
    @Transactional
    @CacheEvict(key = "'tree'") // 删除缓存
    public void del(Long id) {
        super.del(id);
    }

    @Override
    @Transactional
    @CacheEvict(key = "'tree'") // 删除缓存
    public void patchDel(Long[] ids) {
        super.patchDel(ids);
    }


    @Override
    @Transactional
    @Cacheable(key = "'tree'") // 写入缓存
    public List<Menu> menuTree() {
        // 查询所有部门
        List<Menu> all = menuMapper.findAll();
        // 创建一个空map用id-部门表示部门
        HashMap<Long, Menu> map = new HashMap<>();
        // 对部门进行遍历放入map
        for (Menu menu : all) {
            map.put(menu.getId(), menu);
        }
        // 创建一个集合用来存部门树
        ArrayList<Menu> menuTree = new ArrayList<>();
        // 遍历判断如果没有上级部门即为顶级部门，直接放入
        for (Menu menu : all) {
            if (menu.getParentId() == null) {
                menuTree.add(menu);
            } else { // 不是顶级部门，查找上级部门
                Long parentId = menu.getParentId();
                // 找到父部门，将自己放入上级部门的children中
                Menu parentMenu = map.get(parentId);
                parentMenu.getChildren().add(menu);
            }
        }
        return menuTree;
    }
}
